package com.yan.design.two.establish.s1.single;

/**
 * 创建型模式：一.单例模式
 *      分为有8种方式：
 *      1. 饿汉式（静态常量）
 *      2. 饿汉式（静态代码块）
 *      3. 懒汉式（线程不安全）
 *      4. 懒汉式（线程安全，同步方法）
 *      5. 懒汉式（线程安全，同步代码块）
 *      6. 双重检测
 *      7. 静态内部类
 *      8. 枚举
 * @author shengren.yan
 * @create 2022-07-14
 */
public class Single3 {

    public static void main(String[] args) {
        // 6 双重检测
        Single s1 = Single.getSingle();
        Single s2 = Single.getSingle();
        System.out.println(s1 == s2);
        s1.id = 3;
        System.out.println(s2.id);

        // 7 静态内部类
        Single7 s71 = Single7.getSingle();
        Single7 s72 = Single7.getSingle();
        System.out.println(s1 == s2);
        s1.id = 3;
        System.out.println(s2.id);
    }

    // 6 双重检测  -- 推荐使用
    static class Single{
        // 构造方法私有 - 防止对象被new出来，需要去掉static
        private Single(){}
        private static volatile Single single; // volatile 线程之间变量共享，防止指令重排
        public static Single getSingle(){
            if (single == null) {
                synchronized(Single.class){
                    if (single == null) {
                        single = new Single();
                    }
                }
            }
            return single;
        }
        private Integer id;
        public Integer getIn() {
            return id;
        }
    }

    // 7 静态内部类
    static class Single7{
        // 构造方法私有
        private Single7(){}
        private static class SingleStatic{
            private static final Single7 single = new Single7();
        }
        public static Single7 getSingle(){
            return SingleStatic.single;
        }
        private Integer id;
        public Integer getIn() {
            return id;
        }
    }


}
